/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package web;

import dtos.EncomendaDTO;
import dtos.LinhaEncomendaDTO;
import dtos.ProdutoCatalogoDTO;
import dtos.ProdutoFisicoDTO;
import ejb.AdministradorBean;
import ejb.EncomendaBean;
import ejb.ProdutoCatalogoBean;
import ejb.ProdutoFisicoBean;
import excecoes.EntidadeNaoExistenteException;

import javax.faces.event.ActionEvent;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import utils.FacesExceptionHandler;

/**
 *
 * @author Joel
 */
@ManagedBean
@SessionScoped
public class AdministradorManager implements Serializable {

    @EJB
    AdministradorBean adminBean;
    @EJB
    EncomendaBean encomendaBean;
    @EJB
    ProdutoFisicoBean produtoFisicoBean;
    @EJB
    ProdutoCatalogoBean produtoCatalogoBean;
    
    private static final Logger logger = Logger.getLogger("web.AdministradorManager");
    private UIComponent componente;
    private final EncomendaDTO encomendaNova;
    private EncomendaDTO encomendaAtual;
    private final LinhaEncomendaDTO  linhaEncomendaNova;
    private LinhaEncomendaDTO linhaEncomendaAtual;
    
    private ProdutoCatalogoDTO produtoCatalogoAtual;
    private final ProdutoCatalogoDTO produtoCatalogoNovo;
    private ProdutoFisicoDTO produtoFisicoAtual;
    private final ProdutoFisicoDTO produtoFisicoNovo;
    
    
    public AdministradorManager() {

        encomendaNova = new EncomendaDTO();
        linhaEncomendaNova = new LinhaEncomendaDTO();
        produtoCatalogoNovo = new ProdutoCatalogoDTO();
        produtoFisicoNovo = new ProdutoFisicoDTO();
    }

    /**
     ************************
     ****** ENCOMENDAS*******
     ************************
     * @return 
     */
    public List<EncomendaDTO> getEncomendas() {
        try {
            return encomendaBean.getAllEncomendas();

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de encomendas.", logger);
            return null;
        }
    }

    public EncomendaDTO getEncomenda(int id) {
        try {
            return encomendaBean.getEncomenda(id);

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de encomendas.", logger);
            return null;
        }
    }

    public String criarEncomenda() {
        try {
            encomendaBean.criarEncomenda(encomendaNova.getId(),
                    encomendaNova.getDataEncomenda(), encomendaNova.getCodFarmacia());
            return "admin_encomenda_listar?faces-redirect=true";

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_encomenda_listar";
    }
    
    public String addLinhaEncomenda() {
        try {
            
            encomendaBean.adicionarLinha(encomendaNova.getId(), linhaEncomendaNova.getId(), linhaEncomendaNova.getQuantidade());
            return "admin_encomenda_criar?faces-redirect=true";
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_encomenda_criar";
    }
    
    
    
    public String alterarLinhaEncomenda(){
        try {
            encomendaBean.alterarLinha(encomendaNova.getId(), linhaEncomendaAtual.getId(), linhaEncomendaAtual.getQuantidade());
            return "admin_encomenda_criar?faces-redirect=true";
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_encomenda_criar";
    }
    
    public String submeterEncomenda(){
        try {
            encomendaBean.submeterEncomenda(encomendaAtual.getId());
            return "admin_encomenda_listar?faces-redirect=true";
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_encomenda_listar";
    }
    
     
    public UIComponent getComponente() {
        return componente;
    }

    public void setComponente(UIComponent componente) {
        this.componente = componente;
    }

    public EncomendaDTO getEncomendaAtual() {
        return encomendaAtual;
    }

    public void setEncomendaAtual(EncomendaDTO encomendaAtual) {
        this.encomendaAtual = encomendaAtual;
    }
    
    
    public EncomendaDTO getEncomendaNova(){
        
        return encomendaNova;
        
    }
    
    public String criarProdutoCatalogo() {
        try {
            produtoCatalogoBean.criarProdutoCatalogo(produtoCatalogoNovo.getId(),
                    produtoCatalogoNovo.getPreco(),
                    produtoCatalogoNovo.getReferencia(),
                    produtoCatalogoNovo.getLaboratorio(),
                    produtoCatalogoNovo.getNome());
            return "admin_produto_catalogo_criar?faces-redirect=true";

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_produto_catalogo_criar";
    }
    
    public String alterarProdutoCatalogo() {
        // VER CODIGO
        
        try {
            produtoCatalogoBean.alterarProdutoCatalogo(produtoCatalogoAtual.getId(),
                    produtoCatalogoAtual.getPreco(),
                    produtoCatalogoAtual.getReferencia(),
                    produtoCatalogoAtual.getLaboratorio(),
                    produtoCatalogoAtual.getNome(), 
                    (int) produtoCatalogoAtual.getCodStock());
            return "admin_produto_catalogo_listar?faces-redirect=true";
            
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_produto_catalogo_alterar";
    }
    


    public void removerProdutoCatalogo(){
        try {
            produtoCatalogoBean.removerProdutoCatalogo(produtoCatalogoAtual.getId());
            
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
    }

    
    public String criarProdutoFisico() {
        try {
            produtoFisicoBean.criarProdutoFisico(produtoFisicoNovo.getId(),
                    produtoFisicoNovo.getEstado(),
                    produtoFisicoNovo.getLote(),
                    produtoFisicoNovo.getCodArmazem(),
                    produtoFisicoNovo.getCodProdutoCatalogo());                     
            return "admin_produto_catalogo_criar?faces-redirect=true";
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_produto_fisico_criar";
    }

    
    public List<ProdutoCatalogoDTO> getProdutosCatalogo(){
        try {
            return produtoCatalogoBean.getAllProdutosCatalogo();
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Produtos de Catalogo.", logger);
            return null;
        }
    }
    
    public ProdutoCatalogoDTO getProdutoCatalogo(int id) {
        try {
            return produtoCatalogoBean.getProdutoCatalogo(id);
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver o Produto de Catalogo com o id : "+id, logger);
            return null;
        }
    }
    
    
    public List<ProdutoFisicoDTO> getProdutosFisicos(){
        try {
            return produtoFisicoBean.getAllProdutosFisico();
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Produtos de Físicos.", logger);
            return null;
        }
    }
    
    public ProdutoFisicoDTO getProdutoFisico(int id) {
        try {
            return produtoFisicoBean.getProdutoFisico(id);
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver o Produto de Físico com o id : "+id, logger);
            return null;
        }
    }
    
    public LinhaEncomendaDTO getLinhaEncomendaNova() {
        return linhaEncomendaNova;
    }

    public LinhaEncomendaDTO getLinhaEncomendaAtual() {
        return linhaEncomendaAtual;
    }

    public ProdutoCatalogoDTO getProdutoCatalogoNovo() {
        return produtoCatalogoNovo;
    }

    public ProdutoFisicoDTO getProdutoFisicoNovo() {
        return produtoFisicoNovo;
    }

    public ProdutoCatalogoDTO getProdutoCatalogoAtual() {
        return produtoCatalogoAtual;
    }

    public ProdutoFisicoDTO getProdutoFisicoAtual() {
        return produtoFisicoAtual;
    }

    
    
}
